﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using SegIdenPC.Entidad;
using log4net;
using SegIdenPC.Herramientas;
using GS1.Utilitario;

namespace SegIdenPC.Formularios
{
    public partial class frmMantCliente : Form
    {
        #region --- Variables y Propiedades ---
        private static readonly ILog log = LogManager.GetLogger(typeof(frmMantCliente));

        private const string TITULO = "Mantenimiento de Clientes";
        private const string FORMATO_TOTAL_ENCONTRADOS = "Total clientes encontrados: {0}";

        private const string NRODOCUMENTO = "Nº Doc";
        private const string RAZONSOCIAL = "Razón Social";
        private string ESTADO = string.Empty;

        public enum OperacionMantenimiento
        {
            Nuevo,
            Editar
        }

        private OperacionMantenimiento tipoOperacion = OperacionMantenimiento.Nuevo;

        private enum Opcion
        {
            Abrir = 0,
            Nuevo = 1,
            Editar = 2,
            Grabar = 3,
            Cancelar = 4,
            Eliminar = 5
        }

        public Cliente clienteActual { get; set; }

        public bool formularioBusqueda { get; set; }

        private ListaDistrito listaDistrito = null;
        #endregion

        #region --- Constructor ---
        public frmMantCliente()
        {
            InitializeComponent();
        }
        #endregion

        #region --- Eventos Formulario ---
        private void frmMantCliente_Load(object sender, EventArgs e)
        {
            cargarFormulario();
        }

        private void frmMantCliente_FormClosing(object sender, FormClosingEventArgs e)
        {
            finalizarFormulario();
        }

        private void tbtnAbrir_Click(object sender, EventArgs e)
        {
            abrir();
        }

        private void tbtnNuevo_Click(object sender, EventArgs e)
        {
            nuevo();
        }

        private void tbtnEditar_Click(object sender, EventArgs e)
        {
            editar();
        }

        private void tbtnGrabar_Click(object sender, EventArgs e)
        {
            grabar();
        }

        private void tbtnCancelar_Click(object sender, EventArgs e)
        {
            cancelar();
        }

        private void tbtnEliminar_Click(object sender, EventArgs e)
        {
            eliminar();
        }

        private void tbtnSalir_Click(object sender, EventArgs e)
        {
            salir();
        }

        private void btnBuscar_Click(object sender, EventArgs e)
        {
            buscar();
        }

        private void btnAgregar_Click(object sender, EventArgs e)
        {
            agregarContacto();
        }

        private void btnEliminar_Click(object sender, EventArgs e)
        {
            quitarContacto();
        }

        private void tabControl_Selecting(object sender, TabControlCancelEventArgs e)
        {
            if (!e.TabPage.Enabled) { e.Cancel = true; }
        }

        private void dgvListado_CellDoubleClick(object sender, DataGridViewCellEventArgs e)
        {
            seleccionarCliente();
        }

        private void txtCriterio_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.KeyCode == Keys.Enter) { buscar(); }
        }

        private void dgvListadoContactos_CellContentClick(object sender, DataGridViewCellEventArgs e)
        {
            seleccionarContactoCliente();
        }

        private void tbtnRetorno_Click(object sender, EventArgs e)
        {
            retorno();
        }
        #endregion

        #region --- Metodos Propios ---

        private void retorno()
        {
            //Revisar
            if ((this.tipoOperacion == OperacionMantenimiento.Editar) ||
                 (!this.grpDatos.Enabled))
            {
                this.cboCriterio.Text = NRODOCUMENTO;
                this.txtCriterio.Text = this.txtNroDocumento.Text;
            }

            if (!this.txtCriterio.Text.Equals(string.Empty))
            {
                // Refrescar grilla
                listarClientes(this.cboCriterio.Text, this.txtCriterio.Text);
            }

            // Estableciendo estado de TagPage de Listado y datos
            this.tabPagListado.Enabled = true; this.tabPagDatos.Enabled = false;

            // Mostrar la primera pagina del TabControl
            this.tabControl.SelectedIndex = 0;

            // Deshabilitando el grupoBox de datos
            this.grpDatos.Enabled = false;

            // Estableciendo los estados de los botones
            cambiarEstadoBotones(Opcion.Cancelar);

            // Estableciendo focus al caja de texto de busqueda
            this.txtCriterio.Focus();
        }

        private void cargarFormulario()
        {
            ListaGeneral listaTipoDocumento = null;
            ListaGeneral listaEstado = null;
            ListaDistrito listaDistrito = null;

            try
            {
                Cursor.Current = Cursors.WaitCursor;

                // Activaciones de botones por rol
                controlBotonesPorRol();

                // Instanciando y creando listado de documentos
                listaTipoDocumento = new ListaGeneral();
                listaTipoDocumento.Add(new General { codigo = Constantes.CODIGO_TIPO_DOCUMENTO_DNI, descripcion = Constantes.DESCRIPCION_TIPO_DOCUMENTO_DNI });
                listaTipoDocumento.Add(new General { codigo = Constantes.CODIGO_TIPO_DOCUMENTO_RUC, descripcion = Constantes.DESCRIPCION_TIPO_DOCUMENTO_RUC });
                listaTipoDocumento.Add(new General { codigo = Constantes.CODIGO_TIPO_DOCUMENTO_CE, descripcion = Constantes.DESCRIPCION_TIPO_DOCUMENTO_CE });
                listaTipoDocumento.Add(new General { codigo = Constantes.CODIGO_TIPO_DOCUMENTO_CI, descripcion = Constantes.DESCRIPCION_TIPO_DOCUMENTO_CI });

                // Instanciando y creando listado de estado
                listaEstado = new ListaGeneral();
                listaEstado.Add(new General { codigo = Constantes.ESTADO_CODIGO_ACTIVO, descripcion = Constantes.ESTADO_DESCRIPCION_ACTIVO });
                listaEstado.Add(new General { codigo = Constantes.ESTADO_CODIGO_INACTIVO, descripcion = Constantes.ESTADO_DESCRIPCION_INACTIVO });

                // Desactivando el grupo de campo de informacion
                this.tabPagDatos.Enabled = false;

                //Instanciando y creando listado de Distritos
                listaDistrito = new ListaDistrito();

                // Estableciendo Ficha 0 como seleccion incial
                this.tabControl.SelectedIndex = 0;
                // Capturando evento selecting en el control Tab
                this.tabControl.Selecting += new TabControlCancelEventHandler(tabControl_Selecting);

                // Estableciendo a 0 el texto del total de registros encontrados.
                this.lblTotalRegistros.Text = string.Format(FORMATO_TOTAL_ENCONTRADOS, 0);

                // Desactivando el boton abrir.
                this.tbtnAbrir.Enabled = false;

                // Estableciendo parametros del Combo Criterio
                this.cboCriterio.Items.Add(RAZONSOCIAL);
                this.cboCriterio.Items.Add(NRODOCUMENTO);
                this.cboCriterio.SelectedIndex = 0;

                // Estableciendo parametros del combo Tipo documento
                this.cboTipoDocumento.DataSource = listaTipoDocumento;
                this.cboTipoDocumento.ValueMember = Constantes.GENERAL_CODIGO;
                this.cboTipoDocumento.DisplayMember = Constantes.GENERAL_DESCRIPCION;
                this.cboTipoDocumento.SelectedIndex = 0;

                // Estableciendo datos del combo Estado
                this.cboEstado.DataSource = listaEstado;
                this.cboEstado.ValueMember = Constantes.GENERAL_CODIGO;
                this.cboEstado.DisplayMember = Constantes.GENERAL_DESCRIPCION;
                this.cboEstado.SelectedIndex = 0;

                cargarDistritos();

                // Estableciendo focus
                this.txtCriterio.Focus();

            }
            catch (Exception ex)
            {
                log.Error(ex.Message, ex);
                Libreria.MensajeError(ex, TITULO);
            }
            finally
            {
                Cursor.Current = Cursors.Default;
            }
        }

        private void finalizarFormulario()
        {
            this.tabControl.Selecting -= new TabControlCancelEventHandler(tabControl_Selecting);
        }

        private void pintarGrilla()
        {
            ListPersonalizada<Cliente> listaClientes = null;
            listaClientes = (ListPersonalizada<Cliente>)this.dgvListado.DataSource;

            if (listaClientes != null)
            {
                for (int i = 0; i < listaClientes.Count; i++)
                {
                    var cliente = listaClientes[i];

                    switch (cliente.tipoDocumento)
                    {
                        case Constantes.CODIGO_TIPO_DOCUMENTO_DNI:
                            cliente.tipoDocumento = Constantes.DESCRIPCION_TIPO_DOCUMENTO_DNI;
                            break;
                        case Constantes.CODIGO_TIPO_DOCUMENTO_RUC:
                            cliente.tipoDocumento = Constantes.DESCRIPCION_TIPO_DOCUMENTO_RUC;
                            break;
                        case Constantes.CODIGO_TIPO_DOCUMENTO_CE:
                            cliente.tipoDocumento = Constantes.DESCRIPCION_TIPO_DOCUMENTO_CE;
                            break;
                        case Constantes.CODIGO_TIPO_DOCUMENTO_CI:
                            cliente.tipoDocumento = Constantes.DESCRIPCION_TIPO_DOCUMENTO_CI;
                            break;
                    }

                    cliente.estado = cliente.estado.Equals(Constantes.ESTADO_CODIGO_INACTIVO) ? Constantes.ESTADO_DESCRIPCION_INACTIVO : Constantes.ESTADO_DESCRIPCION_ACTIVO;

                    if (cliente.estado == Constantes.ESTADO_DESCRIPCION_INACTIVO)
                    {
                        this.dgvListado.Rows[i].DefaultCellStyle.BackColor = Color.FromArgb(255, 128, 128);
                    }
                }
            }
        }

        private void cargarDistritos()
        {
            Operacion operacion = null;
            string contenidoXML = string.Empty;

            // Estableciendo operacion a ser enviada al Servicio REST
            operacion = new Operacion();
            operacion.numero = Constantes.OPERACION_LISTAR_DISTRITOS;

            // Instanciando y ejecutando llamada al ServicioREST
            ConexionREST conexionREST = new ConexionREST();
            contenidoXML = conexionREST.ejecutarOperacion(operacion);

            // Obteniendo Objeto de Error
            OperacionError operacionError = contenidoXML.DeserializarTo<OperacionError>();

            // Validar si hay error
            if (operacionError != null)
            {
                Libreria.ShowMessageboxError(operacionError.descripcion);
                return;
            }

            // Obteniendo Objeto de ListaPais (Paises)
            this.listaDistrito = contenidoXML.DeserializarTo<ListaDistrito>();

            // Estableciendo listado de paises
            this.cboDistrito.DataSource = this.listaDistrito.lista;
            this.cboDistrito.ValueMember = "codigo";
            this.cboDistrito.DisplayMember = "descripcion";
            this.cboDistrito.SelectedIndex = 27;

        }


        private bool validarEntradaBusqueda()
        {
            this.txtCriterio.Text = this.txtCriterio.Text.Trim();
            if (this.txtCriterio.Text.Equals(string.Empty))
            {
                Libreria.CampoNecesario(this.txtCriterio, "Debe ingresar el valor de busqueda");
                return true;
            }

            if (this.txtCriterio.TextLength < 3)
            {
                Libreria.CampoNecesario(this.txtCriterio, "Debe ingresar por lo menos 3 caracteres para realizar la busqueda");
                return true;
            }

            return false;
        }

        private void listarClientes(string criterio,
                                    string valor)
        {
            Operacion operacion = null;
            string contenidoXML = string.Empty;

            // Estableciendo operacion a ser enviada al Servicio REST
            operacion = new Operacion();
            operacion.numero = Constantes.OPERACION_LISTAR_CLIENTES;

            operacion.cliente = new Cliente();
            operacion.cliente.nroDocumento = string.Empty;
            operacion.cliente.razonSocial = string.Empty;
            operacion.cliente.estado = this.ESTADO;

            switch (criterio)
            {
                case NRODOCUMENTO:
                    operacion.cliente.nroDocumento = valor;
                    break;
                case RAZONSOCIAL:
                    operacion.cliente.razonSocial = valor;
                    break;
            }

            // Instanciando y ejecutando llamada al ServicioREST
            ConexionREST conexionREST = new ConexionREST();
            contenidoXML = conexionREST.ejecutarOperacion(operacion);

            // Obteniendo Objeto de Error
            OperacionError operacionError = contenidoXML.DeserializarTo<OperacionError>();

            // Validar si hay error
            if (operacionError != null)
            {
                Libreria.ShowMessageboxError(operacionError.descripcion);
                return;
            }

            // Obteniendo Objeto de ListaCliente
            ListaCliente listaCliente = contenidoXML.DeserializarTo<ListaCliente>();

            // Mostrar el total de registros encontrados
            this.lblTotalRegistros.Text = string.Format(FORMATO_TOTAL_ENCONTRADOS, listaCliente.lista.Count);

            // Se establece propiedad para evitar que genere nuevas columnas que no estan mapeadas en la grilla
            this.dgvListado.AutoGenerateColumns = false;

            // Se establece la fuente de datos de la grilla
            this.dgvListado.DataSource = listaCliente.lista;

            // Activando o desactivando boton Abrir
            this.tbtnAbrir.Enabled = listaCliente.lista.Count > 0;

            // Colorear grilla deacuerdo a criterios
            pintarGrilla();
        }

        private void buscar()
        {

            try
            {
                if (validarEntradaBusqueda()) { return; }

                // Listar clientes con el criterio y el valor ingresado
                listarClientes(this.cboCriterio.Text, this.txtCriterio.Text);

                // Estableciendo focus al caja de texto de busqueda
                this.txtCriterio.Focus();
            }
            catch (Exception ex)
            {
                log.Error(ex.Message, ex);
                Libreria.MensajeError(ex, TITULO);
            }
        }

        private void nuevo()
        {
            // Estableciendo estado de TagPage de Listado y datos
            this.tabPagListado.Enabled = false; this.tabPagDatos.Enabled = true;

            // Mostrar la segunda pagina del TabControl
            this.tabControl.SelectedIndex = 1;

            this.grpDatos.Enabled = true;
            this.cboEstado.Enabled = false;

            // Estableciendo los estados de los botones
            cambiarEstadoBotones(Opcion.Nuevo);

            // Limpiar los datos del formulario
            limpiarTodo();

            this.tipoOperacion = OperacionMantenimiento.Nuevo;

            // Estableciendo focus al combo tipo documento
            this.cboTipoDocumento.Focus();
        }

        private void editar()
        {
            this.grpDatos.Enabled = true;
            this.cboEstado.Enabled = true;

            // Estableciendo los estados de los botones
            cambiarEstadoBotones(Opcion.Editar);

            this.tipoOperacion = OperacionMantenimiento.Editar;

            // Estableciendo focus al combo tipo documento
            this.cboTipoDocumento.Focus();
        }

        private void abrir()
        {
            // Estableciendo estado de TagPage de Listado y datos
            this.tabPagListado.Enabled = false; this.tabPagDatos.Enabled = true;

            // Mostrar la segunda pagina del TabControl
            this.tabControl.SelectedIndex = 1;

            // Estableciendo los estados de los botones
            cambiarEstadoBotones(Opcion.Abrir);

            // Valida si seleccione algun equipos
            if (this.dgvListado.CurrentRow != null && this.dgvListado.CurrentRow.Index > -1)
            {
                ListPersonalizada<Cliente> listaCliente = (ListPersonalizada<Cliente>)this.dgvListado.DataSource;
                this.clienteActual = listaCliente[this.dgvListado.CurrentRow.Index];

                this.cboTipoDocumento.Text = this.clienteActual.tipoDocumento;
                this.txtNroDocumento.Text = this.clienteActual.nroDocumento;
                this.txtRazonSocial.Text = this.clienteActual.razonSocial;
                this.txtRuc.Text = this.clienteActual.ruc;
                this.txtDireccion.Text = this.clienteActual.direccion;
                this.cboEstado.Text = this.clienteActual.estado;
                this.cboDistrito.Text = this.clienteActual.distrito.descripcion;

                // Cargar contactos del cliente
                abrir_contactos(this.clienteActual.codCliente);
            }
        }

        private void abrir_contactos(string codigoCliente)
        {
            Operacion operacion = null;
            string contenidoXML = string.Empty;

            // Estableciendo operacion a ser enviada al Servicio REST
            operacion = new Operacion();
            operacion.numero = Constantes.OPERACION_OBTENER_CLIENTE;
            operacion.cliente = new Cliente { codCliente = codigoCliente };

            // Instanciando y ejecutando llamada al ServicioREST
            ConexionREST conexionREST = new ConexionREST();
            contenidoXML = conexionREST.ejecutarOperacion(operacion);

            // Obteniendo Objeto de Error
            OperacionError operacionError = contenidoXML.DeserializarTo<OperacionError>();

            // Validar si hay error
            if (operacionError != null)
            {
                Libreria.ShowMessageboxError(operacionError.descripcion);
                return;
            }

            // Obteniendo Objeto de Cliente
            Cliente cliente = contenidoXML.DeserializarTo<Cliente>();

            // Se establece propiedad para evitar que genere nuevas columnas que no estan mapeadas en la grilla
            this.dgvListadoContactos.AutoGenerateColumns = false;

            this.dgvListadoContactos.DataSource = cliente.listaContactoCliente.lista == null ? 
                                                    new ListPersonalizada<ContactoCliente>() : 
                                                    cliente.listaContactoCliente.lista;
        }

        private void cancelar()
        {
            if ( (this.tipoOperacion == OperacionMantenimiento.Editar) ||
                 (!this.grpDatos.Enabled))
            {
                this.cboCriterio.Text = NRODOCUMENTO;
                this.txtCriterio.Text = this.txtNroDocumento.Text;
            }

            if (!this.txtCriterio.Text.Equals(string.Empty))
            {
                // Refrescar grilla
                listarClientes(this.cboCriterio.Text, this.txtCriterio.Text);
            }

            // Estableciendo estado de TagPage de Listado y datos
            this.tabPagListado.Enabled = true; this.tabPagDatos.Enabled = false;

            // Mostrar la primera pagina del TabControl
            this.tabControl.SelectedIndex = 0;

            // Deshabilitando el grupoBox de datos
            this.grpDatos.Enabled = false;

            // Estableciendo los estados de los botones
            cambiarEstadoBotones(Opcion.Cancelar);

            // Estableciendo focus al caja de texto de busqueda
            this.txtCriterio.Focus();
        }

        private void grabar()
        {
            Operacion operacion = null;
            string contenidoXML = string.Empty;

            try
            {
                if (validarEntrada()) { return; }

                // Solicitar confirmacion
                if (!Libreria.ShowMessageboxPregunta((this.tipoOperacion == OperacionMantenimiento.Nuevo?
                                                                            "¿Estas seguro de registrar el cliente?" :
                                                                            "¿Estas seguro de modificar el cliente actual?"), TITULO)) { return; }

                // Estableciendo operacion a ser enviada al Servicio REST
                operacion = new Operacion();
                operacion.numero = this.tipoOperacion == OperacionMantenimiento.Nuevo ? Constantes.OPERACION_REGISTRAR_CLIENTE : Constantes.OPERACION_MODIFICAR_CLIENTE;

                operacion.cliente = new Cliente();
                operacion.cliente.codCliente = this.tipoOperacion == OperacionMantenimiento.Nuevo ? Constantes.VALOR_CERO : this.clienteActual.codCliente;
                operacion.cliente.tipoDocumento = this.cboTipoDocumento.SelectedValue.ToString();
                operacion.cliente.nroDocumento = this.txtNroDocumento.Text;
                operacion.cliente.razonSocial = this.txtRazonSocial.Text;
                operacion.cliente.ruc = this.txtRuc.Text;
                operacion.cliente.direccion = this.txtDireccion.Text;
                operacion.cliente.estado = this.cboEstado.SelectedValue.ToString();
                operacion.cliente.fechaRegistro = DateTime.Now.ToString(Constantes.FORMATO_FECHAHORA);
                operacion.cliente.distrito = new Distrito();

                foreach (Distrito distrito in this.listaDistrito.lista)
                {
                    if (distrito.codigo.ToString().Equals(this.cboDistrito.SelectedValue.ToString()) &&
                        distrito.descripcion.Equals(this.cboDistrito.Text))
                    {
                        operacion.cliente.distrito = distrito;
                    }
                }

                operacion.cliente.listaContactoCliente = new ListaContactoCliente();
                operacion.cliente.listaContactoCliente.lista = (ListPersonalizada<ContactoCliente>)this.dgvListadoContactos.DataSource;

                // Instanciando y ejecutando llamada al ServicioREST
                ConexionREST conexionREST = new ConexionREST();
                contenidoXML = conexionREST.ejecutarOperacion(operacion);

                // Obteniendo Objeto de Error
                OperacionError operacionError = contenidoXML.DeserializarTo<OperacionError>();

                // Validar si hay error
                if (operacionError != null)
                {
                    Libreria.ShowMessageboxError(operacionError.descripcion);
                    return;
                }

                OperacionResultado operacionResultado = contenidoXML.DeserializarTo<OperacionResultado>();

                string mensajeOK = this.tipoOperacion == OperacionMantenimiento.Nuevo ? "Registro guardado correctamente" : "Datos modificado correctamente";
                string mensajeError = this.tipoOperacion == OperacionMantenimiento.Nuevo ? "No se guardo los datos" : "No se actualizo los datos";


                if ((operacionResultado != null) &&
                    (operacionResultado.esOK.Equals(Constantes.SI)))
                {
                    Libreria.ShowMessageboxInfo(mensajeOK, TITULO);
                }
                else
                {
                    Libreria.ShowMessageboxError(mensajeError, TITULO);
                    return;
                }
               

                // Estableciendo los estados de los botones
                cambiarEstadoBotones(Opcion.Grabar);
            }
            catch (Exception ex)
            {
                log.Error(ex.Message, ex);
                Libreria.MensajeError(ex, TITULO);
            }
        }

        private void eliminar()
        {
            Operacion operacion = null;
            string contenidoXML = string.Empty;

            try
            {
                // Solicitar confirmacion para eliminar el cliente
                if (!Libreria.ShowMessageboxPregunta("¿Esta seguro de eliminar a este Cliente?", TITULO)) { return; }

                // Estableciendo operacion a ser enviada al Servicio REST
                operacion = new Operacion();
                operacion.numero = Constantes.OPERACION_ELIMINAR_CLIENTE;

                operacion.cliente = new Cliente { codCliente = this.clienteActual.codCliente };

                // Instanciando y ejecutando llamada al ServicioREST
                ConexionREST conexionREST = new ConexionREST();
                contenidoXML = conexionREST.ejecutarOperacion(operacion);

                // Obteniendo Objeto de Error
                OperacionError operacionError = contenidoXML.DeserializarTo<OperacionError>();

                // Validar si hay error
                if (operacionError != null)
                {
                    Libreria.ShowMessageboxError(operacionError.descripcion);
                    return;
                }

                OperacionResultado operacionResultado = contenidoXML.DeserializarTo<OperacionResultado>();

                if ((operacionResultado != null) &&
                    (operacionResultado.esOK.Equals(Constantes.SI)))
                {
                    Libreria.ShowMessageboxInfo("Registro eliminado correctamente", TITULO);
                }
                else
                {
                    Libreria.ShowMessageboxError("No se elimino el Registro", TITULO);
                    return;
                }

                // Estableciendo estado de TagPage de Listado y datos
                this.tabPagListado.Enabled = true; this.tabPagDatos.Enabled = false;

                // Mostrar la primera pagina del TabControl
                this.tabControl.SelectedIndex = 0;

                this.grpDatos.Enabled = false;

                listarClientes(string.Empty, string.Empty);

                // Estableciendo los estados de los botones
                cambiarEstadoBotones(Opcion.Eliminar);
            }
            catch (Exception ex)
            {
                log.Error(ex.Message, ex);
                Libreria.MensajeError(ex, TITULO);
            }
        }

        private bool validarEntrada()
        {
            /*bool resultado = false;

            this.txtNroDocumento.Text = this.txtNroDocumento.Text.Trim();
            this.txtRazonSocial.Text = this.txtRazonSocial.Text.Trim();
            this.txtDireccion.Text = this.txtDireccion.Text.Trim();
            
            return resultado;*/

            this.txtNroDocumento.Text = this.txtNroDocumento.Text.Trim();
            this.txtRazonSocial.Text = this.txtRazonSocial.Text.Trim();
            this.txtDireccion.Text = this.txtDireccion.Text.Trim();

             if (this.txtNroDocumento.Text.Equals(string.Empty))
             {
                 Libreria.CampoNecesario(this.txtNroDocumento, "Debe ingresar número de documento", TITULO);
                 return true;
             }

             if (this.txtRazonSocial.Text.Equals(string.Empty))
             {
                 Libreria.CampoNecesario(this.txtRazonSocial, "Debe ingresar nombre y/o razón social de cliente", TITULO);
                 return true;
             }
             if (this.txtDireccion.Text.Equals(string.Empty))
             {
                 Libreria.CampoNecesario(this.txtDireccion, "Debe ingresar nombre y/o razón social de cliente", TITULO);
                 return true;
             }

             return false;
        }

        private void cambiarEstadoBotones(Opcion tipoOpcion)
        {
            switch (tipoOpcion)
            {
                case Opcion.Abrir:
                    this.tbtnEditar.Enabled = true;
                    this.tbtnNuevo.Enabled = true;
                    this.tbtnEliminar.Enabled = true;
                    this.tbtnCancelar.Enabled = true;
                    this.tbtnRetorno.Enabled = true;

                    this.tbtnAbrir.Enabled = false;
                    this.tbtnGrabar.Enabled = false;
                    break;
                case Opcion.Nuevo:
                    this.tbtnGrabar.Enabled = true;
                    this.tbtnCancelar.Enabled = true;

                    this.tbtnNuevo.Enabled = false;
                    this.tbtnAbrir.Enabled = false;
                    this.tbtnEditar.Enabled = false;
                    this.tbtnEliminar.Enabled = false;
                    this.tbtnRetorno.Enabled = false;
                    break;
                case Opcion.Editar:
                    this.tbtnGrabar.Enabled = true;
                    this.tbtnCancelar.Enabled = true;
                    this.tbtnRetorno.Enabled = true;
                    this.tbtnEditar.Enabled = false;
                    this.tbtnNuevo.Enabled = false;
                    this.tbtnEliminar.Enabled = false;
                    break;
                case Opcion.Grabar:
                    this.tbtnNuevo.Enabled = true;
                    this.tbtnEliminar.Enabled = true;
                    this.tbtnCancelar.Enabled = true;
                    this.tbtnEditar.Enabled = true;
                    this.tbtnRetorno.Enabled = true;

                    this.tbtnGrabar.Enabled = false;
                    break;
                case Opcion.Cancelar:
                    //this.tbtnAbrir.Enabled = true;
                    this.tbtnNuevo.Enabled = true;

                    this.tbtnEliminar.Enabled = false;
                    this.tbtnCancelar.Enabled = false;
                    this.tbtnGrabar.Enabled = false;
                    this.tbtnEditar.Enabled = false;
                    this.tbtnRetorno.Enabled = false;
                    break;
                case Opcion.Eliminar:
                    this.tbtnAbrir.Enabled = true;
                    this.tbtnNuevo.Enabled = true;

                    this.tbtnEliminar.Enabled = false;
                    this.tbtnCancelar.Enabled = false;
                    this.tbtnGrabar.Enabled = false;
                    this.tbtnEditar.Enabled = false;
                    this.tbtnRetorno.Enabled = false;
                    break;
            }
        }

        private void limpiarTodo()
        {
            this.txtNroDocumento.Text = string.Empty;
            this.txtRazonSocial.Text = string.Empty;
            this.txtRuc.Text = string.Empty;
            this.txtDireccion.Text = string.Empty;
            this.cboDistrito.SelectedIndex = 27;

            this.cboEstado.Text = Constantes.ESTADO_DESCRIPCION_ACTIVO;

            limpiarContacto();

            ListPersonalizada<ContactoCliente> listaContactoCliente = (ListPersonalizada<ContactoCliente>)this.dgvListadoContactos.DataSource;

            if (listaContactoCliente != null)
            {
                listaContactoCliente.Clear();

                this.dgvListadoContactos.DataSource = null;
                this.dgvListadoContactos.DataSource = listaContactoCliente;
            }
        }

        private void limpiarContacto()
        {
            this.txtContactoNombresyApellidos.Text = string.Empty;
            this.txtContactoEmail.Text = string.Empty;
            this.txtContactoTelefono.Text = string.Empty;
            this.txtContactoRelacion.Text = string.Empty;
        }

        private bool validarEntradaContacto()
        {
            bool resultado = false;

            this.txtContactoNombresyApellidos.Text = this.txtContactoNombresyApellidos.Text.Trim();
            this.txtContactoEmail.Text = this.txtContactoEmail.Text.Trim();
            this.txtContactoTelefono.Text = this.txtContactoTelefono.Text.Trim();
            this.txtContactoRelacion.Text = this.txtContactoRelacion.Text.Trim();

            if (this.txtContactoNombresyApellidos.Text.Equals(string.Empty))
            {
                Libreria.CampoNecesario(this.txtContactoNombresyApellidos, "Debe ingresar el campo Nombres y apellidos del contacto", TITULO);
                return true;
            }

           

            return resultado;
        }

        private void seleccionarContactoCliente()
        {
            // Valida si seleccione algun contactocliente
            if (this.dgvListadoContactos.CurrentRow != null && this.dgvListadoContactos.CurrentRow.Index > -1)
            {
                // Obteniendo lista de contactos
                ListPersonalizada<ContactoCliente> listaContactoCliente = (ListPersonalizada<ContactoCliente>)this.dgvListadoContactos.DataSource;
                ContactoCliente ContactoClienteActual = new ContactoCliente();
                ContactoClienteActual = listaContactoCliente[this.dgvListadoContactos.CurrentRow.Index];

                //Cargar datos
                this.txtContactoNombresyApellidos.Text = ContactoClienteActual.nombresyApellidos;
                this.txtContactoEmail.Text = ContactoClienteActual.email;
                this.txtContactoTelefono.Text = ContactoClienteActual.telefono;
                this.txtContactoRelacion.Text = ContactoClienteActual.relacion;
            }
        }

        private void agregarContacto()
        {
            try
            {
                if (validarEntradaContacto()) { return; }

                // Obteniendo lista de contactos
                ListPersonalizada<ContactoCliente> listaContactoCliente = (ListPersonalizada<ContactoCliente>)this.dgvListadoContactos.DataSource;
                if (listaContactoCliente == null) { listaContactoCliente = new ListPersonalizada<ContactoCliente>(); }

                // Instanciando contacto
                ContactoCliente contactoCliente = new ContactoCliente();
                contactoCliente.nombresyApellidos = this.txtContactoNombresyApellidos.Text;
                contactoCliente.email = this.txtContactoEmail.Text;
                contactoCliente.telefono = this.txtContactoTelefono.Text;
                contactoCliente.relacion = this.txtContactoRelacion.Text;
                if (this.chkIndEnvioEmail.Checked == true) contactoCliente.indenvioemail = Constantes.SI;
                else contactoCliente.indenvioemail = Constantes.NO;

                if (validarContactoRepetido(this.txtContactoNombresyApellidos.Text))
                {
                    ListPersonalizada<ContactoCliente> listaContactoClientenuevo = new ListPersonalizada<ContactoCliente>();

                    if (listaContactoCliente != null)
                    {
                        foreach (ContactoCliente item in listaContactoCliente)
                        {
                            if (item.nombresyApellidos.Equals(this.txtContactoNombresyApellidos.Text)) {}
                            else
                            {
                                listaContactoClientenuevo.Add(item);
                            }
                        }
                        listaContactoCliente = listaContactoClientenuevo;
                    }
                }

                // Agregando contacto
                listaContactoCliente.Add(contactoCliente);

                // Se establece propiedad para evitar que genere nuevas columnas que no estan mapeadas en la grilla
                this.dgvListadoContactos.AutoGenerateColumns = false;

                // Actualizando en grilla
                this.dgvListadoContactos.DataSource = null;
                this.dgvListadoContactos.DataSource = listaContactoCliente;

                // Limpiando campos del contacto
                limpiarContacto();

                // Estableciendo focus
                this.txtContactoNombresyApellidos.Focus();
            }
            catch (Exception ex)
            {
                log.Error(ex.Message, ex);
                Libreria.MensajeError(ex, TITULO);
            }
        }

        private void quitarContacto()
        {
            try
            {
                // Obteniendo lista de contactos
                ListPersonalizada<ContactoCliente> listaContactoCliente = (ListPersonalizada<ContactoCliente>)this.dgvListadoContactos.DataSource;

                if (listaContactoCliente != null && listaContactoCliente.Count > 0)
                {
                    // Obteniedo contacto seleccionado
                    ContactoCliente contactoCliente = listaContactoCliente[this.dgvListadoContactos.CurrentRow.Index];

                    // Eliminando contacto
                    listaContactoCliente.Remove(contactoCliente);

                    // Se establece propiedad para evitar que genere nuevas columnas que no estan mapeadas en la grilla
                    this.dgvListadoContactos.AutoGenerateColumns = false;

                    // Actualizando en grilla
                    this.dgvListadoContactos.DataSource = null;
                    this.dgvListadoContactos.DataSource = listaContactoCliente;
                }
            }
            catch (Exception ex)
            {
                log.Error(ex.Message, ex);
                Libreria.MensajeError(ex, TITULO);
            }
        }

        private bool validarContactoRepetido(string nombresyApellidos)
        {
            bool resultato = false;

            // Obteniendo lista de contactos
            ListPersonalizada<ContactoCliente> listaContactoCliente = (ListPersonalizada<ContactoCliente>)this.dgvListadoContactos.DataSource;

            if (listaContactoCliente != null)
            {
                foreach (ContactoCliente item in listaContactoCliente)
                {
                    if (item.nombresyApellidos.Equals(nombresyApellidos))
                    {
                        resultato = true;
                        break;
                    }
                }
            }

            return resultato;
        }

        private void seleccionarCliente()
        {
            if (this.formularioBusqueda)
            {
                // Valida si seleccione algun cliente
                if (this.dgvListado.CurrentRow != null && this.dgvListado.CurrentRow.Index > -1)
                {
                    ListPersonalizada<Cliente> listaCliente = (ListPersonalizada<Cliente>)this.dgvListado.DataSource;
                    this.clienteActual = listaCliente[this.dgvListado.CurrentRow.Index];

                    this.DialogResult = DialogResult.OK;
                }
            }
        }

        private void controlBotonesPorRol()
        {
            if (ParametrosAplicacion.ROL_ADMINISTRADOR.codigo.Equals(ParametrosAplicacion.USUARIO_ACTUAL.rol.codigo)) { return; }

            //this.tbtnNuevo.Visible = false;
            //this.tbtnEditar.Visible = false;
            this.tbtnEliminar.Visible = false;
            //this.tbtnGrabar.Visible = false;

            this.ESTADO = Constantes.ESTADO_CODIGO_ACTIVO;
        }

        private void salir()
        {
            if (this.formularioBusqueda)
            {
                this.DialogResult = DialogResult.Cancel;
            }
            else
            {
                this.Close();
            }
        }
        #endregion
    }
}
